import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
/*用户注册界面对象
继承JFrame对象,调用图像化界面的方法
实现ActionListener,重写动作监听方法
 */
public class RegisteJFrame extends JFrame implements ActionListener {
    //用户存放用户在集合中的索引
    ArrayList<Account> list=null;
    //声明登录界面对象
    LoginJFrame loginJFrame=null;

    //新建用户名,密码,id的输入框对象
    JTextField userNamefield =new JTextField();
    JPasswordField passwordField=new JPasswordField();
    JPasswordField okpasswordField=new JPasswordField();
    JPasswordField idField=new JPasswordField();

    //新建注册和放回按钮对象
    JButton registeB=new JButton("注册");
    JButton returnB=new JButton("返回");

    //新建用户名,密码,身份证号有误通知弹窗
    JDialog userNameWarn =new JDialog();
    JDialog passwordWarn=new JDialog();
    JDialog idWarn=new JDialog();

    /**
     * 构造方法,初始化用户界面
     * @param list 用户集合
     * @param loginJFrame 登录界面对象
     */
    public RegisteJFrame(ArrayList<Account> list,LoginJFrame loginJFrame) {
        //将用户集合赋值给本类集合
        this.list=list;
        //将登录界面对象赋值给本类对象
        this.loginJFrame=loginJFrame;
        //登录界面和内容初始化
        JFrameInit();
        registeInit();
    }

    /**
     * 登录界面初始化
     */
    private void JFrameInit() {
        //设置界面标题,大小,默认关闭,位置
        this.setTitle("注册界面");
        this.setSize(400,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
    }

    /**
     * 界面内容初始化
     */
    public void registeInit() {
        //清空容器内容
        this.getContentPane().removeAll();
        //取消容器默认位置摆放
        this.setLayout(null);
        //新建用户名,密码,确认密码,身份证号按钮对象
        JButton userNameB=new JButton("用户名");
        JButton passwordB=new JButton("密码");
        JButton okpasswordB=new JButton("确认密码");
        JButton idB=new JButton("身份证号");

        //新建密码提醒文本容器
        JLabel tip=new JLabel("输入6-9位密码");

        //设置用户名,密码,确认密码,身份证号,确认,返回密码按钮大小,位置
        userNameB.setBounds(50,30,90,30);
        passwordB.setBounds(50,110,90,30);
        okpasswordB.setBounds(50,190,90,30);
        idB.setBounds(50,270,90,30);
        registeB.setBounds(90,330,70,30);
        returnB.setBounds(230,330,70,30);
        tip.setBounds(160,110,100,100);

        //返回和注册按钮添加动作监听,以本类作为动作监听接口的实现类
        returnB.addActionListener(this);
        registeB.addActionListener(this);

        //将用户名,密码,登录,注册,忘记密码按钮加入容器中
        this.getContentPane().add(userNameB);
        this.getContentPane().add(passwordB);
        this.getContentPane().add(okpasswordB);
        this.getContentPane().add(idB);
        this.getContentPane().add(registeB);
        this.getContentPane().add(returnB);
        this.getContentPane().add(tip);

        //设置用户名,密码,确认密码输入框
        userNamefield.setBounds(160,30,200,30);
        passwordField.setBounds(160,110,200,30);
        okpasswordField.setBounds(160,190,200,30);
        idField.setBounds(160,270,200,30);

        //将输入框加入容器中
        this.getContentPane().add(userNamefield);
        this.getContentPane().add(passwordField);
        this.getContentPane().add(okpasswordField);
        this.getContentPane().add(idField);

        //刷新界面
        this.repaint();
    }

    /**
     * 重写动作监听方法
     * @param actionEvent
     */
    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        //判断动作来源
        //若来自注册按钮
        if (actionEvent.getSource() == registeB) {
            //判断用户名是否存在
            if (userNameContain(list, userNamefield.getText())>=0||userNamefield.getText().equals("")) {
                //若用户名存在
                //将用户名有误提醒的弹窗设置位置,大小,可视化,默认关闭方式,默认在顶部.
                userNameWarn.setLocationRelativeTo(null);
                userNameWarn.setVisible(true);
                userNameWarn.setSize(300, 100);

                //添加用户名有误提醒
                JLabel tip1 = new JLabel("用户已存在或用户名为空               --按任意键继续");
                userNameWarn.add(tip1);

                //添加键盘监听对象,通过匿名内部类实现键盘监听接口
                userNameWarn.addKeyListener(new KeyListener() {
                    @Override
                    public void keyTyped(KeyEvent keyEvent) {

                    }

                    @Override
                    public void keyPressed(KeyEvent keyEvent) {

                    }

                    /**
                     * 重新释放键盘方法
                     * @param keyEvent
                     */

                    @Override
                    public void keyReleased(KeyEvent keyEvent) {
                        //将用户名有误提醒设为不可见
                        userNameWarn.setVisible(false);
                        //重置注册内容
                        registeInit();
                    }
                });
            } else {
                //若用户名唯一且不为空
                //新建密码和确认密码,身份证字符串获取输入框密码,确认密码,身份证号
                String password = new String(passwordField.getPassword());
                String okpassword = new String(okpasswordField.getPassword());
                String id = new String(idField.getPassword());

                //判断密码是否为空,密码是否为6-9位
                if (!(password.equals("")) && password.matches(".{6,9}") && okpassword.equals(password)) {
                    //若密码格式正确
                    //判断身份证是否合理
                    if (id.matches("[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0\\d|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]")&& idcontain(this.list, id) < 0) {
                        //若身份证格式正确
                        //若新建用户对象,设置用户名,密码,身份证号
                        Account ac=new Account(userNamefield.getText(),password,id);
                        //将用户添加到用户集合
                        list.add(ac);

                        //将注册界面设为不可视
                        this.setVisible(false);
                        //将登录界面设为可视
                        loginJFrame.setVisible(true);
                    } else {
                        //若用户身份证号格式有误
                        //添加有误提醒
                        JLabel tip2 = new JLabel("身份证格式有误或身份证已存在          --按任意键继续");
                        idWarn.add(tip2);

                        //将用户身份证号格式有误提醒的弹窗设置位置,大小,可视化,默认关闭方式,默认在顶部
                        idWarn.setLocationRelativeTo(null);
                        idWarn.setVisible(true);
                        idWarn.setSize(300, 100);
                        idWarn.add(tip2);

                        //添加键盘监听对象,通过匿名内部类实现键盘监听接口
                        idWarn.addKeyListener(new KeyListener() {
                            @Override
                            public void keyTyped(KeyEvent keyEvent) {

                            }

                            @Override
                            public void keyPressed(KeyEvent keyEvent) {

                            }

                            /**
                             * 重写键盘监听方法
                             * @param keyEvent
                             */
                            @Override
                            public void keyReleased(KeyEvent keyEvent) {
                                //将身份证号有误提醒界面设为不可视
                                idWarn.setVisible(false);
                                //重置注册界面内容
                                registeInit();
                            }
                        });
                    }
                } else {
                    //若用户密码格式有误
                    //添加密码格式有误的提醒
                    JLabel tip3 = new JLabel("密码格式有误或密码为空                   --按任意键继续");

                    //将密码错误提醒的弹窗设置位置,大小,可视化,默认关闭方式,默认在顶部
                    passwordWarn.setVisible(true);
                    passwordWarn.setLocationRelativeTo(null);
                    passwordWarn.setSize(300, 100);
                    passwordWarn.add(tip3);
                    passwordWarn.addKeyListener(new KeyListener() {
                        @Override
                        public void keyTyped(KeyEvent keyEvent) {

                        }

                        @Override
                        public void keyPressed(KeyEvent keyEvent) {

                        }

                        /**
                         * 重写键盘释放方法
                         * @param keyEvent
                         */
                        @Override
                        public void keyReleased(KeyEvent keyEvent) {
                            //按任意键
                            //将密码错误提醒设为不可视
                            passwordWarn.setVisible(false);

                            //重置注册界面内容
                            registeInit();
                        }
                    });
                }
            }
        }
        else {
            //若动作来源为返回按钮
            if(actionEvent.getSource()==returnB){
                //重置注册界面内容
                registeInit();
                //将注册界面设置不可视
                this.setVisible(false);
                //将登录界面设置为可视
                loginJFrame.setVisible(true);
            }
        }
    }

    /**
     * 在用户集合查询用户身份证号对应索引
     * @param list 用户集合
     * @param id 身份证号
     * @return 返回用户身份证号对应索引
     */
    private int idcontain(ArrayList<Account> list, String id) {
        //遍历集合,查询用户身份证
        for (int i = 0; i < list.size(); i++) {
            //判断身份证是否与用户集合中相同
            if(list.get(i).getId().equals(id))
                //若相同返回对应索引
                return i;
            }
        //若不存在,返回-1
        return -1;
    }

    /**
     * 在用户集合中查询用户名对应索引
     * @param list 用户集合
     * @param text 查询的用户名
     * @return 对应索引
     */
    private int userNameContain(ArrayList<Account> list, String text) {
        for (int i = 0; i < list.size(); i++) {
            //判断用户名与用户集合中是否相同
                  if(list.get(i).getUserName().equals(text))
                      //若相同返回对应索引
                      return i;
        }
        //若用户不存在,返回-1
        return -1;
    }

}
